<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/11/28/028
 * Time: 12:03
 */

namespace app\api\service;

use app\api\model\ErrorLog;
use app\api\model\NoteCode as NoteCodeModel;
use app\lib\exception\NoteCodeException;
use think\Env;
use think\facade\Log;


class NoteCode {

    /**
     * 获取验证码数据
     * @param $param
     * @return array|null|\PDOStatement|string|\think\Model
     * @throws NoteCodeException
     */
    public static function VerificationCode($param) {
        $code = NoteCodeModel::checkVerificationCode($param);
        if (!$code) {
            throw new NoteCodeException();
        }

        self::checkVerificationCode($code);

        return true;
    }

    /**
     * 检查验证码有效性
     * @param $code
     * @return bool
     * @throws NoteCodeException
     */
    private static function checkVerificationCode($code) {
        if ($code->status > 0) {
            throw new NoteCodeException([
                'msg' => '验证码已使用',
                'errorCode' => 50001
            ]);
        }

        if ($code->create_time < (time() - 360)) {
            throw new NoteCodeException([
                'msg' => '验证码已过期',
                'errorCode' => 50002
            ]);
        }
        return true;
    }

    /**
     * 发送验证码
     * @param $param
     * @return bool
     * @throws NoteCodeException
     */
    public static function send_code($param) {
        file_put_contents(\think\facade\Env::get('root_path') . 'runtime/send_code.txt', json_encode($param));
        $code = rand(1000, 9999);
        switch ($param['type']) {
            case 1:  // 验证码
                if ($param['mobile'] == 15802571830) {
                    // 发送成功  添加记录
                    NoteCodeModel::create(['code' => $code, 'mobile' => $param['mobile']]);
                }
                $msg = '【衣依不舍】您的验证码是' . $code;
                break;
            case 2:  // 新订单
                $msg = '【衣依不舍】发现新订单，请及时处理，订单号:' . $param['order_sn'] . '，定制人:' . $param['linkman'] . '，联系电话:' . $param['address_mobile'] . '，收货地址:' . $param['address'];
                break;
            case 3:  // 用户售后申请
                $msg = '【衣依不舍】发现新的售后订单，售后单号' . $param['order_sn'];
                break;
            case 4:  // 量体师工作完成
                $msg = '【衣依不舍】量体师确认量体完成，订单号:' . $param['order_sn'];
                break;
            case 5:  // 量体师工作完成
                $msg = '【衣依不舍】用户已寄回售后产品，售后单号:' . $param['order_sn'];
                break;
            case 6:  // 量体师申请
                $msg = '【衣依不舍】量体师入驻申请，申请人:' . $param['name'] . '，联系电话:' . $param['p_mobile'];
                break;
            case 7:  // 门店申请
                $msg = '【衣依不舍】门店入驻申请，申请人:' . $param['name'] . '，联系电话:' . $param['p_mobile'];
                break;
            case 8:  // 定制订单支付完成
                $msg = '【衣依不舍】新定制订单支付成功，订单号:' . $param['order_sn'] . '，定制人:' . $param['linkman'] . '，联系电话:' . $param['address_mobile'] . '，收货地址:' . $param['address'];
                break;
            case 9:  // 商城订单支付完成
                $msg = '【衣依不舍】新商城订单支付成功，订单号:' . $param['order_sn'] . '，定制人:' . $param['linkman'] . '，联系电话:' . $param['address_mobile'] . '，收货地址:' . $param['address'];
                break;
            case 10:  // 实名认证申请
                $msg = '【衣依不舍】实名认证申请，申请人:' . $param['name'];
                break;
            case 11:  // 充值结算失败
                $msg = '【衣依不舍】充值结算失败，充值账户:' . $param['username'] . '，充值单号:' . $param['order_sn'] . '，充值金额:' . $param['price'];
                break;
            case 12:  // 用户申请提现
                $msg = '【衣依不舍】用户申请提现，申请账户:' . $param['username'] . '，提现单号:' . $param['order_sn'] . '，提现金额:' . $param['price'];
                break;
            case 13:  // 激活直推短信通知
                $msg = '【衣依不舍】尊敬的用户您好，感谢您分享衣依定制平台，为了不影响您的个人利益，请您前往平台购买任意商品进行身份认证！';
                break;
            case 14:  // 激活直推短信通知
                $msg = '【衣依不舍】尊敬的用户您好，您的快递已签收，订单号：'.$param['order_sn'].'，快递单号：'.$param['express_sn'].'‘欢迎在次购买’！';
                break;
            default :
                Log::init(
                    [
                        'type' => 'File',
                        'path' => LOG_PATH,
                        'level' => ['error']
                    ]);
                Log::record('短信类型错误', 'error');
                return false;
                break;
        }

        $url = 'http://sapi.253.com/msg/HttpBatchSendSM?account=minnanws88&pswd=Mnws2016&mobile=' . $param['mobile'] . '&msg=' . $msg . '&needstatus=true';
        $data = file_get_contents($url);
        $data = explode(',', $data);
        $base_code = substr($data[1], 0, 3);
        if ($base_code > 0) {
            Log::init(
                [
                    'type' => 'File',
                    'path' => LOG_PATH,
                    'level' => ['error']
                ]);
            Log::record(self::get_note_error_msg($base_code), 'error');
            return false;
        }

        if ($param['type'] == 1 && $param['mobile'] != 15802571830) {
            // 发送成功  添加记录
            NoteCodeModel::create(['code' => $code, 'mobile' => $param['mobile']]);
        }

        return true;
    }

    /**
     * 获取短信接口返回码对应描述信息
     * @param $code
     * @return mixed
     */
    public static function get_note_error_msg($code) {
        $msg_array = [
            101 => '无此用户',
            102 => '密码错',
            103 =>	'提交过快（提交速度超过流速限制）',
            104 =>	'系统忙（因平台侧原因，暂时无法处理提交的短信）',
            105 =>	'敏感短信（短信内容包含敏感词）',
            106 =>	'消息长度错（>536或<=0）',
            107 =>	'包含错误的手机号码',
            108 =>	'手机号码个数错（群发>50000或<=0;单发>200或<=0）',
            109 =>	'无发送额度（该用户可用短信数已使用完）',
            110 =>	'不在发送时间内',
            111 =>	'超出该账户当月发送额度限制',
            112 =>	'无此产品，用户没有订购该产品',
            113 =>	'extno格式错（非数字或者长度不对）',
            115 =>	'自动审核驳回',
            116 =>	'签名不合法，未带签名（用户必须带签名的前提下）',
            117 =>	'IP地址认证错,请求调用的IP地址不是系统登记的IP地址',
            118 =>	'用户没有相应的发送权限',
            119 =>	'用户已过期',
            120 =>	'测试内容不是白名单'
        ];
        return $msg_array[$code];
    }
}